package com.divemotor.ventarepuestosinternet.model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.annotations.ParamDef;


@Entity
@Table(name = "SIS_MAE_USUARIO")
@NamedQueries({
    @NamedQuery(name="Usuario.sistema", query="SELECT u FROM Usuario u JOIN FETCH u.listaPerfiles l JOIN l.sistema s JOIN s.listaPaises p " +
            								  "WHERE l.sistema.idSistema = :sistema AND s.idSistema = :sistema AND u.pais.idPais = p.idPais AND UPPER(u.usuario) = UPPER(:usuario)"),
    @NamedQuery(name="Usuario.getSolicitud", 
    			query="SELECT u FROM Usuario u JOIN u.listaSolicitudes so " +
			  		  "WHERE so.idSolicitudContrasenia = :idSolicitud")
})
@FilterDef(name="perfiles", parameters=@ParamDef( name="idSistema", type="integer" ) )
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1468272685417583889L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_SIS_MAE_USUARIO")
	@SequenceGenerator(name = "SEQ_SIS_MAE_USUARIO", sequenceName = "SISTEMAS.SEQ_SIS_MAE_USUARIO", allocationSize = 0)
	@Column(name = "COD_ID_USUARIO")
	private Integer idUsuario;
	//UserName de logueo
	@Column(name = "TXT_USUARIO")
	private String usuario;
	@Column(name = "TXT_CONTRASENIA")
	private String contrasenia;
	@Column(name = "TXT_NOMBRES", length = 50)
	private String nombres;
	@Column(name = "TXT_APELLIDOS", length = 100)
	private String apellidos;
	@Column(name = "TXT_CORREO", length = 50)
	private String correo;
	@ManyToOne
	@JoinColumn(name = "COD_ID_PAIS")
	@ForeignKey(name = "SIS_MAE_USUARIO_FK01")
	private Pais pais;
	@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="SIS_MAE_PERFIL_USUARIO", joinColumns=
			@JoinColumn(name="COD_ID_USUARIO", referencedColumnName="COD_ID_USUARIO"),
			inverseJoinColumns=@JoinColumn(name="COD_ID_PERFIL", referencedColumnName="COD_ID_PERFIL"))
	@Filter(name="perfiles", condition="COD_ID_SISTEMA = :idSistema")
	private List<Perfil> listaPerfiles;
	@OneToMany(mappedBy="usuario" , fetch=FetchType.LAZY)
	private List<Administrador> administradores;
	@OneToMany(mappedBy="usuario", fetch=FetchType.LAZY)
	private List<Vendedor> vendedores;
	@OneToMany(mappedBy="usuario", fetch=FetchType.LAZY)
	private List<Supervisor> supervisores;
	@OneToMany(mappedBy="usuario", fetch=FetchType.LAZY)
	private List<SolicitudContrasenia> listaSolicitudes;
	
	@Transient
	private String repetirContrasenia;
	
	public Usuario() {
		
	}
	
	public Usuario(String nombres, String apellidos) {
		this.nombres = nombres;
		this.apellidos = apellidos;
	}

	public Integer getIdUsuario() {
		return idUsuario;
	}
	
	public void setIdUsuario(Integer idUsuario) {
		this.idUsuario = idUsuario;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getContrasenia() {
		return contrasenia;
	}

	public void setContrasenia(String contrasenia) {
		this.contrasenia = contrasenia;
	}

	public String getNombres() {
		return nombres;
	}

	public void setNombres(String nombres) {
		this.nombres = nombres;
	}

	public String getApellidos() {
		return apellidos;
	}

	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	public String getCorreo() {
		return correo;
	}

	public void setCorreo(String correo) {
		this.correo = correo;
	}

	public Pais getPais() {
		return pais;
	}

	public void setPais(Pais pais) {
		this.pais = pais;
	}

	public List<Perfil> getListaPerfiles() {
		return listaPerfiles;
	}

	public void setListaPerfiles(List<Perfil> listaPerfiles) {
		this.listaPerfiles = listaPerfiles;
	}

	public List<Administrador> getAdministradores() {
		return administradores;
	}

	public void setAdministradores(List<Administrador> administradores) {
		this.administradores = administradores;
	}

	public List<Vendedor> getVendedores() {
		return vendedores;
	}

	public void setVendedores(List<Vendedor> vendedores) {
		this.vendedores = vendedores;
	}

	public List<Supervisor> getSupervisores() {
		return supervisores;
	}

	public void setSupervisores(List<Supervisor> supervisores) {
		this.supervisores = supervisores;
	}

	public String getRepetirContrasenia() {
		return repetirContrasenia;
	}

	public void setRepetirContrasenia(String repetirContrasenia) {
		this.repetirContrasenia = repetirContrasenia;
	}

	public List<SolicitudContrasenia> getListaSolicitudes() {
		return listaSolicitudes;
	}

	public void setListaSolicitudes(List<SolicitudContrasenia> listaSolicitudes) {
		this.listaSolicitudes = listaSolicitudes;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((idUsuario == null) ? 0 : idUsuario.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		Usuario other = (Usuario) obj;
		if (idUsuario == null) {
			if (other.idUsuario != null){
				return false;
			}
		} else if (!idUsuario.equals(other.idUsuario)){
			return false;
		}
		return true;
	}
	
}